require'zdc.idutil'
local isparent=zdc.idutil.IsParent
module(..., package.seeall)

AutoDS = {}
AutoDS_mt ={__metatable = {}, __index = AutoDS}

function new(params)
	local obj = {}
	setmetatable(obj, AutoDS_mt)
	obj.__gen_ds=params.GENDS
	obj.__free_ds=params.FREEDS
	obj.__calc_key=params.CALCKEY
	obj.inuse=false
	obj.inusekey=false
	return obj
end

local function __get_ds(self,id)
	local k=self.__calc_key(id)
	if not k then return nil end
--[[
	local ds=self.inuse[k]
	if ds then return ds end
	ds=self.__gen_ds(k)
	if ds then
		self.inuse[k]=ds
	end
	return ds
--]]
	if self.inusekey==k then
		return self.inuse
	else
		ds=self.__gen_ds(k)
		if ds then
			if self.inuse then
				self.__free_ds(self.inuse)
			end
			self.inuse=ds
			self.inusekey=k
		end
		return ds
	end
end

function AutoDS:transdo(fn)
	return fn()
end

function AutoDS:node_exist(id)
	local ds=__get_ds(self,id)
	if ds then return ds:node_exist(id) end
	return nil
end

function AutoDS:get_node(id)
	local ds=__get_ds(self,id)
	if ds then return ds:get_node(id) end
	return nil
end

function AutoDS:save_node(id,data,ik,st)
	local ds=__get_ds(self,id)
	if ds then return ds:save_node(id,data,ik,st) end
	error('AutoDS not support save['..id .. ']')
end

function AutoDS:get_child_nodes(parentid)
	local ds=__get_ds(self,parentid)
	if ds then return ds:get_child_nodes(parentid) end
	return {}
end

function AutoDS:get_child_nodes_ex(parentid,where,sort,limit)
	local ds=__get_ds(self,parentid)
	if ds then return ds:get_child_nodes_ex(parentid,where,sort,limit) end
	return {},{}
end

function AutoDS:get_nodes_by_prefix(prefix)
	local ds=__get_ds(self,prefix)
	if ds then return ds:get_nodes_by_prefix(prefix) end
	return {}
end

function AutoDS:get_nodes_by_prefix_ex(prefix)
	local ds=__get_ds(self,prefix)
	if ds then return ds:get_nodes_by_prefix_ex(prefix) end
	return {}
end

function AutoDS:get_ids_by_prefix(prefix)
	local ds=__get_ds(self,prefix)
	if ds then return ds:get_ids_by_prefix(prefix) end
	return {}
end
function AutoDS:get_ids_by_prefix_ex(prefix)
	local ds=__get_ds(self,prefix)
	if ds then return ds:get_ids_by_prefix_ex(prefix) end
	return {},{}
end
function AutoDS:del_node(id,deep)
	local ds=__get_ds(self,id)
	if ds then return ds:del_node(id,deep) end
	error('AutoDS not support del['..id .. ']')
end

function AutoDS:del_sub_nodes(parentid)
	local ds=__get_ds(self,parentid)
	if ds then return ds:del_sub_nodes(parentid) end
	error('AutoDS not support delsub['..id .. ']')
end
